`timescale 1ns / 1ns

module run_led#
(
parameter T_INR_CNT_SET = 32'd49_999_999            //分频时钟计数，初始时钟过快，人眼观察会导致LED常亮

)                                                               //设置分频系数，降低流水灯的变化速度

(                                                               //该参数可以由上层调用时修改
 input          I_sysclk,                                       //系统时钟信号
 input          I_rstn,                                         //全局复位
 output [3:0]   O_led                                           //LED灯输出
);

reg [3:0] led_r;                                      //设置一个LED的寄存器，用来存储LED信号状态
reg[32:0] t_cnt;
assign O_led = led_r;                                            //将寄存器内信号输出
always @(posedge I_sysclk or negedge I_rstn)begin
    if(I_rstn==1'b0)                                             //系统复位
       t_cnt <= 0;
    else if(t_cnt == T_INR_CNT_SET)                             //计数t_cnt达到目标时清零
       t_cnt <= 0;
    else
       t_cnt <= t_cnt + 1'b1;                                     //否则计数+1
end

always @(posedge I_sysclk or negedge I_rstn)begin         //系统时钟的上升沿触发以及复位的下降沿触发

    if(I_rstn==1'b0)
        led_r <= 4'b1000;                             //设置LED 寄存器的初始状态，1表示灯亮，0表示灯灭
    else if( t_cnt == 0)                            //当计数器计数达到预定值被清零时
        led_r <= {led_r[0],led_r[3:1]};           //LED寄存器将最低为左移至最高位，通过{}来完成数据的拼接
end

endmodule